﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Controles.Validador.Componentes;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using GDM.Hogar.Soporte.SafeCast;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Integrantes
{
    public partial class FrmIntegrante
#if DEBUG
 : AdaptadorFrm
#else
     : FrmBase
#endif
    {
        private readonly IActividadManager _actividadManager;
        private readonly IAsisteComedorViandaDiasManager _asisteComedorViandaDiasManager;
        private readonly IIntegranteManager _integranteManager;
        private readonly IObraSocialManager _obraSocialManager;
        private readonly IPersonaReferenciaManager _personaReferenciaManager;
        private readonly IServicioEmergenciaManager _servicioEmergenciaManager;
        private readonly ITipoDocumentoManager _tipoDocumentoManager;
        private readonly IVinculoManager _vinculoManager;
        private BindingSource _bsCasoEmergencia;
        private BindingSource _bsGrupoConvivencia;
        private BindingSource _bsGrupoFamiliar;
        private BindingSource _bsInscripcionTalleres;
        private BindingSource _bsVinculos;
        private IList<ConsultaInscripcion> _inscripciones;
        private IList<PersonaReferencia> _personasReferencia;
        private IList<Vinculo> _vinculos;

        private bool EsProfesional
        {
            get { return ContextoUsuario.RolId == (int)Rol.Profesional; }
        }

        private bool EsCoordinador
        {
            get { return ContextoUsuario.RolId == (int)Rol.Coordinador; }
        }
        private bool EsDocente
        {
            get { return ContextoUsuario.RolId == (int)Rol.Docente; }
        }

        public Action OnIntegranteCreado;
        public Action OnIntegranteActualizado;

        private bool RefrescarInscripciones { get; set; }

        public ConsultaIntegrante Integrante { get; set; }

        #region [Metodos Publicos]

        public FrmIntegrante(ITipoDocumentoManager tipoDocumentoManager, IServicioEmergenciaManager servicioEmergenciaManager, IObraSocialManager obraSocialManager,
                             IIntegranteManager integranteManager, IVinculoManager vinculoManager, IPersonaReferenciaManager personaReferenciaManager,
                             IActividadManager actividadManager, IAsisteComedorViandaDiasManager asisteComedorViandaDiasManager)
        {
            if (asisteComedorViandaDiasManager == null)
                throw new ArgumentNullException("asisteComedorViandaDiasManager");
            if (actividadManager == null)
                throw new ArgumentNullException("actividadManager");
            if (tipoDocumentoManager == null)
                throw new ArgumentNullException("tipoDocumentoManager");
            if (servicioEmergenciaManager == null)
                throw new ArgumentNullException("servicioEmergenciaManager");
            if (obraSocialManager == null)
                throw new ArgumentNullException("obraSocialManager");
            if (integranteManager == null)
                throw new ArgumentNullException("integranteManager");
            if (personaReferenciaManager == null)
                throw new ArgumentNullException("personaReferenciaManager");
            if (vinculoManager == null)
                throw new ArgumentNullException("vinculoManager");

            _asisteComedorViandaDiasManager = asisteComedorViandaDiasManager;
            _tipoDocumentoManager = tipoDocumentoManager;
            _servicioEmergenciaManager = servicioEmergenciaManager;
            _obraSocialManager = obraSocialManager;
            _integranteManager = integranteManager;
            _vinculoManager = vinculoManager;
            _personaReferenciaManager = personaReferenciaManager;
            _actividadManager = actividadManager;
            InitializeComponent();
        }

        #endregion [Metodos Publicos]

        #region [Metodos Privados]

        private void btnReinscribir_Click(object sender, EventArgs e)
        {
            try
            {
                _integranteManager.ActivarIntegrante(Integrante.IntegranteId, true);
                MostrarMensajeExito(Resources.Integrante_ReinscribioConExito);
                if (OnIntegranteActualizado != null)
                {
                    OnIntegranteActualizado();
                }
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.ReinscribirIntegrante_Error);
            }
        }

        private int BeneficioPrevisionalIntegrante
        {
            get
            {
                const int beneficioPrevisional = (int)Entidades.Enums.BeneficioPrevisional.NoTiene;
                if (rbJubilacion.Checked) return (int)Entidades.Enums.BeneficioPrevisional.Jubilacion;
                if (rbPension.Checked) return (int)Entidades.Enums.BeneficioPrevisional.Pension;
                if (rbPensionNoContributiva.Checked)
                    return (int)Entidades.Enums.BeneficioPrevisional.PensionNoContributiva;
                if (rbJubilacionPension.Checked)
                    return (int)Entidades.Enums.BeneficioPrevisional.JubilacionYPension;
                return beneficioPrevisional;
            }
            set
            {
                switch (value)
                {
                    case (int)Entidades.Enums.BeneficioPrevisional.NoTiene:
                        rbNingunBeneficio.Checked = true;
                        break;

                    case (int)Entidades.Enums.BeneficioPrevisional.Jubilacion:
                        rbJubilacion.Checked = true;
                        break;

                    case (int)Entidades.Enums.BeneficioPrevisional.Pension:
                        rbPension.Checked = true;
                        break;

                    case (int)Entidades.Enums.BeneficioPrevisional.PensionNoContributiva:
                        rbPensionNoContributiva.Checked = true;
                        break;

                    case (int)Entidades.Enums.BeneficioPrevisional.JubilacionYPension:
                        rbJubilacionPension.Checked = true;
                        break;
                }
            }
        }

        private int EstadoCivilIntegrante
        {
            get
            {
                const int estadoCivil = (int)EstadoCivil.Soltero;
                if (rbCasadoEnPareja.Checked) return (int)EstadoCivil.CasadoEnPareja;
                if (rbViudo.Checked) return (int)EstadoCivil.Viudo;
                if (rbDivorciado.Checked) return (int)EstadoCivil.Divorciado;
                return estadoCivil;
            }
            set
            {
                switch (value)
                {
                    case (int)EstadoCivil.Soltero:
                        rbSoltero.Checked = true;
                        break;

                    case (int)EstadoCivil.CasadoEnPareja:
                        rbCasadoEnPareja.Checked = true;
                        break;

                    case (int)EstadoCivil.Divorciado:
                        rbDivorciado.Checked = true;
                        break;

                    case (int)EstadoCivil.Viudo:
                        rbViudo.Checked = true;
                        break;
                }
            }
        }

        private NivelEstudioIntegrante NivelEstudioIntegrante
        {
            get
            {
                var nivelEstudioIntegrante = new NivelEstudioIntegrante
                {
                    NivelEstudioCompleto = false,
                    NivelEstudioId = (int)NivelEstudio.Primario
                };
                if (rbPrimarioCompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = true,
                        NivelEstudioId = (int)NivelEstudio.Primario
                    };
                if (rbPrimarioIncompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = false,
                        NivelEstudioId = (int)NivelEstudio.Primario
                    };
                if (rbSecundarioCompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = true,
                        NivelEstudioId = (int)NivelEstudio.Secundario
                    };
                if (rbSecundarioIncompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = false,
                        NivelEstudioId = (int)NivelEstudio.Secundario
                    };
                if (rbTerciarioCompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = true,
                        NivelEstudioId = (int)NivelEstudio.Terciario
                    };
                if (rbTerciarioIncompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = false,
                        NivelEstudioId = (int)NivelEstudio.Terciario
                    };
                if (rbUniversitarioCompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = true,
                        NivelEstudioId = (int)NivelEstudio.Universitario
                    };
                if (rbUniversitarioIncompleto.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = false,
                        NivelEstudioId = (int)NivelEstudio.Universitario
                    };
                if (rbNoLeeNiEscribe.Checked)
                    return new NivelEstudioIntegrante
                    {
                        NivelEstudioCompleto = false,
                        NivelEstudioId = (int)NivelEstudio.SinEstudioNoLeeNiEscribe
                    };
                return rbLeeEscribe.Checked
                           ? new NivelEstudioIntegrante
                           {
                               NivelEstudioCompleto = false,
                               NivelEstudioId = (int)NivelEstudio.SinEstudioPeroLeeEscribe
                           }
                           : nivelEstudioIntegrante;
            }
            set
            {
                switch (value.NivelEstudioId)
                {
                    case (int)NivelEstudio.Primario:
                        if (value.NivelEstudioCompleto)
                            rbPrimarioCompleto.Checked = true;
                        else
                            rbPrimarioIncompleto.Checked = true;
                        break;

                    case (int)NivelEstudio.Secundario:
                        if (value.NivelEstudioCompleto)
                            rbSecundarioCompleto.Checked = true;
                        else
                            rbSecundarioIncompleto.Checked = true;
                        break;

                    case (int)NivelEstudio.Terciario:
                        if (value.NivelEstudioCompleto)
                            rbTerciarioCompleto.Checked = true;
                        else
                            rbTerciarioIncompleto.Checked = true;
                        break;

                    case (int)NivelEstudio.Universitario:
                        if (value.NivelEstudioCompleto)
                            rbUniversitarioCompleto.Checked = true;
                        else
                            rbUniversitarioIncompleto.Checked = true;
                        break;

                    case (int)NivelEstudio.SinEstudioNoLeeNiEscribe:
                        rbNoLeeNiEscribe.Checked = true;
                        break;

                    case (int)NivelEstudio.SinEstudioPeroLeeEscribe:
                        rbLeeEscribe.Checked = true;
                        break;
                }
            }
        }

        private int PropiedadViviendaIntegrante
        {
            get
            {
                const int propiedadVivienda = (int)PropiedadVivienda.Propia;
                if (rbAlquilada.Checked) return (int)PropiedadVivienda.Alquilada;
                if (rbPrestadaOFamiliar.Checked) return (int)PropiedadVivienda.PrestadaOConFamiliar;
                if (rbOtra.Checked) return (int)PropiedadVivienda.Otra;
                return propiedadVivienda;
            }
            set
            {
                switch (value)
                {
                    case (int)PropiedadVivienda.Propia:
                        rbPropia.Checked = true;
                        break;

                    case (int)PropiedadVivienda.PrestadaOConFamiliar:
                        rbPrestadaOFamiliar.Checked = true;
                        break;

                    case (int)PropiedadVivienda.Otra:
                        rbOtra.Checked = true;
                        break;

                    case (int)PropiedadVivienda.Alquilada:
                        rbAlquilada.Checked = true;
                        break;
                }
            }
        }

        private bool FechaNacimientoValida()
        {
            try
            {
                var fecha = new DateTime((int)(cbAño.SelectedItem), cbMes.SelectedIndex + 1, cbDia.SelectedIndex + 1).Date;
                return fecha.CompareTo(DateTime.Now.Date) == -1;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        private bool EdadEsPermitida()
        {
            try
            {
                var fecha = new DateTime((int)(cbAño.SelectedItem), cbMes.SelectedIndex + 1, cbDia.SelectedIndex + 1).Date;
                var fechaPermitida = DateTime.Now.Date.AddYears(EdadMinima * -1);
                return fecha.CompareTo(fechaPermitida) != 1;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        private void GuardarRegistro()
        {
            if (!FormularioValido())
            {
                MostrarMensajeError(Resources.Integrante_CompleteDatosRequeridos);
                return;
            }
            if (!FechaNacimientoValida())
            {
                MostrarMensajeError(Resources.Integrante_FechaNacimientoInvalida);
                return;
            }
            if (!EdadEsPermitida())
            {
                MostrarMensajeError(string.Format(Resources.Integrante_NoPuedeIngresar, EdadMinima));
                return;
            }

            if (cmbObraSocial.SelectedIndex > 0 && !string.IsNullOrEmpty(txtNroAfiliado.Text.Trim()))
            {
                //-Validacion de nro afiliado existente
                var obraSocialId = ((ObraSocial)cmbObraSocial.SelectedItem).ObraSocialId;
                var integranteId = Integrante != null ? Integrante.IntegranteId : 0;
                if (_obraSocialManager.ExisteAfiliadoObraSocial(integranteId, obraSocialId, SafeCast.ToLong(txtNroAfiliado.Text.Trim())))
                {
                    MostrarMensajeError(string.Format(Resources.Afiliado_Existe, txtNroAfiliado.Text.Trim()));
                    return;
                }
            }

            if (Integrante != null)
            {
                //- Modo Edicion

                //-Validacion de nro/tipo documento existente
                if (Integrante.Activo)
                {
                    var tipoDocumentoId = ((TipoDocumento)cmbTipoDocumento.SelectedItem).TipoDocumentoId;
                    if (!Integrante.Dni.Trim().Equals(txtDni.Text.Trim()) ||
                        Integrante.TipoDocumentoId != tipoDocumentoId)
                    {
                        if (_integranteManager.ExisteIntegrante(txtDni.Text.Trim(), tipoDocumentoId))
                        {
                            MostrarMensajeError(string.Format(Resources.Integrante_Existe, txtDni.Text.Trim()));
                            return;
                        }
                    }
                    ActualizarIntegrante();
                }
            }
            else
            {
                //- Modo Creacion

                //-Validacion de nro/tipo documento existente
                var tipoDocumentoId = ((TipoDocumento)cmbTipoDocumento.SelectedItem).TipoDocumentoId;
                if (_integranteManager.ExisteIntegrante(txtDni.Text.Trim(), tipoDocumentoId))
                {
                    MostrarMensajeError(string.Format(Resources.Integrante_Existe, txtDni.Text.Trim()));
                    return;
                }

                CrearIntegrante();
            }
        }

        private void ActualizarIntegrante()
        {
            try
            {
                var datosIntegrante = InstanciarIntegrante();
                datosIntegrante.Integrante.IntegranteId = Integrante.IntegranteId;
                var integranteAsXml = XmlHelper.GetXml(datosIntegrante);
                integranteAsXml = XmlHelper.RemoveAllNamespaces(integranteAsXml);
                _integranteManager.ActualizarIntegrante(integranteAsXml);
                MostrarMensajeExito(Resources.Integrante_GuardoConExito);
                if (RefrescarInscripciones)
                {
                    InicializarGrillaTalleres();
                }
                if (OnIntegranteActualizado != null)
                {
                    OnIntegranteActualizado();
                }
            }
            catch (InvalidOperationException ex)
            {
                MostrarMensajeError(Resources.Integrante_InscripcionMismaFecha);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardarIntegrante_Error);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            _bsGrupoFamiliar.Add(new PersonaReferencia { VinculoId = 0, TipoPersonaReferenciaId = (int)TipoPersonaReferencia.GrupoFamiliar });
            dgvGrupoFamiliar.Rows[dgvGrupoFamiliar.Rows.Count - 1].ErrorText = Resources.Grilla_Completar_CamposRequeridos;
            dgvGrupoFamiliar.Rows[dgvGrupoFamiliar.Rows.Count - 1].Cells[0].ErrorText = Resources.Grilla_Completar_Nombre;
            dgvGrupoFamiliar.Rows[dgvGrupoFamiliar.Rows.Count - 1].Cells[1].ErrorText = Resources.Grilla_Completar_Apellido;
            dgvGrupoFamiliar.Rows[dgvGrupoFamiliar.Rows.Count - 1].Cells[4].ErrorText = Resources.Grilla_Seleccionar_Vinculo;
        }

        private void btnBorrarC_Click(object sender, EventArgs e)
        {
            if (dgvGrupoConvivencia.CurrentRow == null) return;

            dgvGrupoConvivencia.Rows.RemoveAt(dgvGrupoConvivencia.CurrentRow.Index);
        }

        private void btnBorrarGF_Click(object sender, EventArgs e)
        {
            if (dgvGrupoFamiliar.CurrentRow == null) return;

            dgvGrupoFamiliar.Rows.RemoveAt(dgvGrupoFamiliar.CurrentRow.Index);
        }

        private void btnNuevoC_Click(object sender, EventArgs e)
        {
            _bsGrupoConvivencia.Add(new PersonaReferencia { VinculoId = 0, TipoPersonaReferenciaId = (int)TipoPersonaReferencia.GrupoConvivencia });
            dgvGrupoConvivencia.Rows[dgvGrupoConvivencia.Rows.Count - 1].ErrorText = Resources.Grilla_Completar_CamposRequeridos;
            dgvGrupoConvivencia.Rows[dgvGrupoConvivencia.Rows.Count - 1].Cells[0].ErrorText = Resources.Grilla_Completar_Nombre;
            dgvGrupoConvivencia.Rows[dgvGrupoConvivencia.Rows.Count - 1].Cells[1].ErrorText = Resources.Grilla_Completar_Apellido;
            dgvGrupoConvivencia.Rows[dgvGrupoConvivencia.Rows.Count - 1].Cells[3].ErrorText = Resources.Grilla_Seleccionar_Vinculo;
        }

        private void btnNuevoPE_Click(object sender, EventArgs e)
        {
            _bsCasoEmergencia.Add(new PersonaReferencia { VinculoId = 0, TipoPersonaReferenciaId = (int)TipoPersonaReferencia.CasoEmergencia });
            dgvPersonasEmergencia.Rows[dgvPersonasEmergencia.Rows.Count - 1].ErrorText = Resources.Grilla_Completar_CamposRequeridos;
            dgvPersonasEmergencia.Rows[dgvPersonasEmergencia.Rows.Count - 1].Cells[0].ErrorText = Resources.Grilla_Completar_Nombre;
            dgvPersonasEmergencia.Rows[dgvPersonasEmergencia.Rows.Count - 1].Cells[1].ErrorText = Resources.Grilla_Completar_Apellido;
            dgvPersonasEmergencia.Rows[dgvPersonasEmergencia.Rows.Count - 1].Cells[3].ErrorText = Resources.Grilla_Seleccionar_Vinculo;
        }

        private void CargarAñosCalendario()
        {
            for (var i = 1900; i <= DateTime.Now.Year; i++)
            {
                cbAño.Items.Add(i);
            }
        }

        private void CargarAsisteComedorViandaDias()
        {
            var asisteComedorViandaDias = Integrante == null ? new List<AsisteComedorViandaDias>() : _asisteComedorViandaDiasManager.ObtenerTodas(Integrante.IntegranteId);
            if (!asisteComedorViandaDias.Any()) return;

            if (asisteComedorViandaDias[0].ActividadId == (int)TipoActividad.Comedor)
            {
                ckbComedor.Checked = true;
            }
            else
            {
                ckbVianda.Checked = true;
            }
            foreach (var actividadDias in asisteComedorViandaDias)
            {
                switch (actividadDias.DiaSemanaId)
                {
                    case 1:
                        ckbLunes.Checked = true;
                        break;

                    case 2:
                        ckbMartes.Checked = true;
                        break;

                    case 3:
                        ckbMiercoles.Checked = true;
                        break;

                    case 4:
                        ckbJueves.Checked = true;
                        break;

                    case 5:
                        ckbViernes.Checked = true;
                        break;
                }
            }
        }

        private void CargarObrasSociales()
        {
            cmbObraSocial.CargarItems(_obraSocialManager.ObtenerObrasSociales(), "Descripcion", "ObraSocialId", true);
        }

        private void CargarServiciosEmergencia()
        {
            cmbServicioEmergencia.CargarItems(_servicioEmergenciaManager.ObtenerServiciosEmergencia(), "Descripcion", "ServicioEmergenciaId", true);
        }

        private void CargarTiposDocumento()
        {
            cmbTipoDocumento.CargarItems(_tipoDocumentoManager.ObtenerTiposDocumento(), "Descripcion", "TipoDocumentoId", true, "--- Seleccione un Tipo de Documento ---");
        }

        private void CrearIntegrante()
        {
            var datosIntegrante = InstanciarIntegrante();
            try
            {
                var integranteAsXml = XmlHelper.GetXml(datosIntegrante);
                integranteAsXml = XmlHelper.RemoveAllNamespaces(integranteAsXml);
                _integranteManager.GuardarIntegrante(integranteAsXml);
                MostrarMensajeExito(Resources.Integrante_GuardoConExito);
                LimpiarFormularioIntegrante();
                if (OnIntegranteCreado != null)
                {
                    OnIntegranteCreado();
                }
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardarIntegrante_Error);
            }
        }

        private bool FormularioValido()
        {
            var estadoCivilSeleccionado = RbSeleccionado(pnlEstadoCivil, lblEstadoCivil, epEstadoCivil, "Seleccione un Estado Civil");
            var propViviendaSeleccionada = RbSeleccionado(pnlPropVivienda, lblPropVivienda, epPropVivienda, "Seleccione una Propiedad de Vivienda");
            var nivelEstudioSeleccionado = RbSeleccionado(pnlNivelEstudio, lblNivelEstudio, epNivelEstudio, "Seleccione un Nivel de Estudio");
            var benefPrevSeleccionado = RbSeleccionado(pnlBenefPrev, lblBenefPrev, epBenefPrev, "Seleccione un Beneficio Previsional");
            var comedorViandaSeleccionado = pnlComedorVianda.Controls.OfType<CheckBox>().Any(rb => rb.Checked);
            var diasSeleccionado = true;
            if (comedorViandaSeleccionado)
                diasSeleccionado = ChkSeleccionado(pnlDias, lblDias, epDias, "Seleccione al menos 1 dia");
            return integranteValidator.Validate() && estadoCivilSeleccionado && propViviendaSeleccionada && nivelEstudioSeleccionado
                   && benefPrevSeleccionado && diasSeleccionado && GrillaValida(dgvGrupoFamiliar)
                   && GrillaValida(dgvPersonasEmergencia) && GrillaValida(dgvGrupoConvivencia);
        }

        private void CargarDatosPersonales()
        {
            CargarAñosCalendario();
            CargarTiposDocumento();
            var fechaActual = DateTime.Now;
            cbDia.SelectedIndex = fechaActual.Day - 1;
            cbMes.SelectedIndex = fechaActual.Month - 1;
            cbAño.SelectedIndex = cbAño.FindStringExact(fechaActual.Year.ToString(), 0);
            InicializarGrillaGrupoFamiliar();

            if (Integrante != null)
            {
                //- Modo Edicion
                txtDni.Text = Integrante.Dni;
                txtNombre.Text = Integrante.Nombre;
                txtApellido.Text = Integrante.Apellido;
                txtTelefono.Text = Integrante.Telefono;
                txtDomicilio.Text = Integrante.Domicilio;
                cbDia.SelectedIndex = Integrante.FechaNacimiento.Day - 1;
                cbMes.SelectedIndex = Integrante.FechaNacimiento.Month - 1;
                cbAño.SelectedIndex = cbAño.FindStringExact(Integrante.FechaNacimiento.Year.ToString(), 0);
                EstadoCivilIntegrante = Integrante.EstadoCivilId;
                PropiedadViviendaIntegrante = Integrante.PropiedadViviendaId;
                NivelEstudioIntegrante = new NivelEstudioIntegrante
                {
                    NivelEstudioCompleto = Integrante.NivelEstudioCompleto.HasValue && Integrante.NivelEstudioCompleto.Value,
                    NivelEstudioId = Integrante.NivelEstudioId
                };
                cmbTipoDocumento.SelectedIndex = cmbTipoDocumento.FindStringExact(Integrante.TipoDocumento, 0);

                HabilitarControl(tpDatosPersonales, EsProfesional && Integrante.Activo);
            }
        }

        private void CargarDatosAdicionales()
        {
            CargarObrasSociales();
            CargarServiciosEmergencia();

            rbPension.CheckedChanged += rbBeneficioPrev_CheckedChanged;
            rbPensionNoContributiva.CheckedChanged += rbBeneficioPrev_CheckedChanged;
            rbJubilacion.CheckedChanged += rbBeneficioPrev_CheckedChanged;
            rbJubilacionPension.CheckedChanged += rbBeneficioPrev_CheckedChanged;
            rbNingunBeneficio.CheckedChanged += rbBeneficioPrev_CheckedChanged;

            InicializarGrillaCasoEmergencia();
            InicializarGrillaGrupoConvivencia();

            if (Integrante != null)
            {
                //- Modo Edicion
                BeneficioPrevisionalIntegrante = Integrante.BeneficioPrevisionalId;
                txtMonto.Enabled = BeneficioPrevisionalIntegrante != (int)Entidades.Enums.BeneficioPrevisional.NoTiene;
                txtMonto.Text = Integrante.Monto.HasValue ? Integrante.Monto.ToString() : "";
                txtCuotaCooperadora.Text = String.Format("{0:#.###,##}", Integrante.CuotaCooperadora.HasValue ? Integrante.CuotaCooperadora.ToString() : "");
                txtNroAfiliado.Text = Integrante.NroAfiliado != null && Integrante.NroAfiliado.Value == 0 ? string.Empty : Integrante.NroAfiliado.ToString();
                cmbObraSocial.SelectedIndex = cmbObraSocial.FindStringExact(Integrante.ObraSocial, 0);
                cmbServicioEmergencia.SelectedIndex = cmbServicioEmergencia.FindStringExact(Integrante.ServicioEmergencia, 0);

                HabilitarControl(tpDatosAdicionales, EsProfesional && Integrante.Activo);
            }
        }

        private void HabilitarGrillaTalleres(bool habilitar)
        {
            dgvTalleres.Enabled = true;
            dgvTalleres.ReadOnly = false;
            foreach (DataGridViewColumn column in dgvTalleres.Columns)
            {
                if (column is DataGridViewTextBoxColumn)
                {
                    column.ReadOnly = true;
                }
                else
                {
                    column.ReadOnly = !habilitar;
                }
            }
        }

        private void CargarDatosActividades()
        {
            InicializarGrillaTalleres();

            //- Las inscripciones a talleres solo a partir de Marzo. Las inscripciones a Comedor/Vianda solo a partir de Febrero
            if (Integrante != null)
            {
                //- Modo Edicion
                CargarAsisteComedorViandaDias();

                HabilitarControl(tpActividades, EsProfesional && Integrante.Activo);

                pnlComedorVianda.Enabled = (EsProfesional || EsCoordinador) && Integrante.Activo && DateTime.Now.Month > 1;
                pnlDias.Enabled = pnlComedorVianda.Enabled && (ckbComedor.Checked || ckbVianda.Checked);
                var habilitar = (EsProfesional || EsDocente) && Integrante.Activo && DateTime.Now.Month > 2;
                HabilitarGrillaTalleres(habilitar);
            }
            else
            {
                //- Modo Creacion
                pnlComedorVianda.Enabled = DateTime.Now.Month > 1;
                pnlDias.Enabled = pnlComedorVianda.Enabled && (ckbComedor.Checked || ckbVianda.Checked);
                var habilitar = DateTime.Now.Month > 2;
                HabilitarGrillaTalleres(habilitar);
            }
        }

        private void CargarDatosEntrevista()
        {
            if (Integrante != null)
            {
                //- Modo Edicion
                rtxtEntrevista.Text = Integrante.Entrevista;
                HabilitarControl(tpEntrevista, EsProfesional && Integrante.Activo);
            }
        }

        private void FrmIntegrante_Load(object sender, EventArgs e)
        {
            if (Integrante != null)
            {
                btnGuardarIntegrante.Visible = Integrante.Activo && (EsProfesional || EsCoordinador || EsDocente);
                btnReinscribir.Visible = EsProfesional && Integrante.FechaInscripcion.Year != DateTime.Now.Year;
            }
            RefrescarCambios = false;
            _personasReferencia = Integrante != null ? _personaReferenciaManager.ObtenerPersonasReferencia(Integrante.IntegranteId) : new List<PersonaReferencia>();
            _vinculos = _vinculoManager.ObtenerVinculos();
            _vinculos.Insert(0, new Vinculo { VinculoId = 0, Descripcion = "" });
            _bsVinculos = new BindingSource { DataSource = _vinculos };
            tcIntegrante.TabPages.Remove(tpMotivoBaja);
            tcIntegrante.TabPages.Remove(tpEntrevista);

            CargarDatosPersonales();
            CargarDatosAdicionales();
            CargarDatosActividades();
            if (EsProfesional)
            {
                tcIntegrante.TabPages.Add(tpEntrevista);
                CargarDatosEntrevista();
            }

            if (Integrante != null)
            {
                //- Modo Edicion
                if (!Integrante.Activo && EsProfesional)
                {
                    tcIntegrante.TabPages.Add(tpMotivoBaja);
                    txtMotivoBaja.Text = Integrante.ObservacionBaja;
                }
            }
        }

        private void InicializarGrillaCasoEmergencia()
        {
            dgvPersonasEmergencia.AutoGenerateColumns = false;
            var dgvColumn = (DataGridViewComboBoxColumn)dgvPersonasEmergencia.Columns["VinculoE"];
            if (dgvColumn != null)
            {
                dgvColumn.DataPropertyName = "VinculoId";
                dgvColumn.DisplayMember = "Descripcion";
                dgvColumn.ValueMember = "VinculoId";
                dgvColumn.DataSource = _bsVinculos;
            }
            _bsCasoEmergencia = new BindingSource();
            if (Integrante != null)
            {
                var psRef = _personasReferencia.Where(pr => pr.TipoPersonaReferenciaId == (int)TipoPersonaReferencia.CasoEmergencia);
                if (psRef.Any())
                    _bsCasoEmergencia.DataSource = psRef;
            }
            dgvPersonasEmergencia.DataSource = _bsCasoEmergencia;
        }

        private void InicializarGrillaGrupoConvivencia()
        {
            dgvGrupoConvivencia.AutoGenerateColumns = false;
            var dgvColumn = (DataGridViewComboBoxColumn)dgvGrupoConvivencia.Columns["VinculoC"];
            if (dgvColumn != null)
            {
                dgvColumn.DataPropertyName = "VinculoId";
                dgvColumn.DisplayMember = "Descripcion";
                dgvColumn.ValueMember = "VinculoId";
                dgvColumn.DataSource = _bsVinculos;
            }
            _bsGrupoConvivencia = new BindingSource();
            if (Integrante != null)
            {
                var psRef = _personasReferencia.Where(pr => pr.TipoPersonaReferenciaId == (int)TipoPersonaReferencia.GrupoConvivencia);
                if (psRef.Any())
                    _bsGrupoConvivencia.DataSource = psRef;
            }
            dgvGrupoConvivencia.DataSource = _bsGrupoConvivencia;
        }

        private void InicializarGrillaGrupoFamiliar()
        {
            dgvGrupoFamiliar.AutoGenerateColumns = false;
            var dgvColumn = (DataGridViewComboBoxColumn)dgvGrupoFamiliar.Columns["Vinculo"];
            if (dgvColumn != null)
            {
                dgvColumn.DataPropertyName = "VinculoId";
                dgvColumn.DisplayMember = "Descripcion";
                dgvColumn.ValueMember = "VinculoId";
                dgvColumn.DataSource = _bsVinculos;
            }
            _bsGrupoFamiliar = new BindingSource();
            if (Integrante != null)
            {
                var psRef = _personasReferencia.Where(
                        pr => pr.TipoPersonaReferenciaId == (int)TipoPersonaReferencia.GrupoFamiliar);
                if (psRef.Any())
                    _bsGrupoFamiliar.DataSource = psRef;
            }
            dgvGrupoFamiliar.DataSource = _bsGrupoFamiliar;
        }

        private void InicializarGrillaTalleres()
        {
            _bsInscripcionTalleres = new BindingSource();
            _inscripciones = Integrante == null ? _actividadManager.ObtenerInscripcionTalleres() : _actividadManager.ObtenerInscripcionTalleres(Integrante.IntegranteId);
            _bsInscripcionTalleres.DataSource = _inscripciones;
            dgvTalleres.AutoGenerateColumns = false;
            dgvTalleres.DataSource = _bsInscripcionTalleres;
        }

        private DatosIntegrante InstanciarIntegrante()
        {
            var nivelEstudio = NivelEstudioIntegrante;
            var integrante = new Integrante
            {
                Dni = txtDni.Text.Trim(),
                Apellido = txtApellido.Text.Trim(),
                Nombre = txtNombre.Text.Trim(),
                Telefono = txtTelefono.Text.Trim(),
                Domicilio = txtDomicilio.Text.Trim(),
                Activo = true,
                TipoDocumentoId = ((TipoDocumento)cmbTipoDocumento.SelectedItem).TipoDocumentoId,
                FechaNacimiento = new DateTime((int)(cbAño.SelectedItem), cbMes.SelectedIndex + 1, cbDia.SelectedIndex + 1),
                EstadoCivilId = EstadoCivilIntegrante,
                PropiedadViviendaId = PropiedadViviendaIntegrante,
                NivelEstudioId = nivelEstudio.NivelEstudioId,
                NivelEstudioCompleto = nivelEstudio.NivelEstudioCompleto,
                BeneficioPrevisionalId = BeneficioPrevisionalIntegrante,
                Monto = string.IsNullOrEmpty(txtMonto.Text) ? default(decimal?) : SafeCast.ToNullableDecimal(Decimal.Parse(txtMonto.Text, System.Globalization.NumberStyles.Currency)),
                ObraSocialId = cmbObraSocial.SelectedIndex == 0 ? (int?)null : ((ObraSocial)cmbObraSocial.SelectedItem).ObraSocialId,
                NroAfiliado = SafeCast.ToNullableLong(txtNroAfiliado.Text),
                ServicioEmergenciaId = cmbServicioEmergencia.SelectedIndex == 0 ? (int?)null : ((ServicioEmergencia)cmbServicioEmergencia.SelectedItem).ServicioEmergenciaId,
                CuotaCooperadora = string.IsNullOrEmpty(txtCuotaCooperadora.Text) ? default(decimal?) : SafeCast.ToNullableDecimal(Decimal.Parse(txtCuotaCooperadora.Text, System.Globalization.NumberStyles.Currency)),
                Entrevista = rtxtEntrevista.Text
            };
            var datosIntegrante = new DatosIntegrante { Integrante = integrante };
            var gFamiliar = _bsGrupoFamiliar.List as BindingList<PersonaReferencia>;
            if (gFamiliar != null)
            {
                datosIntegrante.GrupoFamiliar = gFamiliar.ToList();
            }
            var gConvivencia = _bsGrupoConvivencia.List as BindingList<PersonaReferencia>;
            if (gConvivencia != null)
            {
                datosIntegrante.GrupoConvivencia = gConvivencia.ToList();
            }
            var pCasoEmergencia = _bsCasoEmergencia.List as BindingList<PersonaReferencia>;
            if (pCasoEmergencia != null)
            {
                datosIntegrante.PersonasCasoEmergencia = pCasoEmergencia.ToList();
            }
            datosIntegrante.AsisteDias = ObtenerAsisteActividadDias();
            var inscTalleres = _bsInscripcionTalleres.List as List<ConsultaInscripcion>;
            if (Integrante == null)
            {
                //-Modo Creacion
                datosIntegrante.InscripcionTalleres = inscTalleres.Where(t => t.Activa).ToList();
            }
            else
            {
                var nuevasInscripciones = new List<ConsultaInscripcion>();
                RefrescarInscripciones = false;
                foreach (var inscripcion in inscTalleres)
                {
                    if (inscripcion.Activa)
                    {
                        if (inscripcion.FechaBaja.HasValue)
                        {
                            if (inscripcion.FechaInscripcion == DateTime.Now.Date)
                            {
                                throw new InvalidOperationException();
                            }
                            nuevasInscripciones.Add(new ConsultaInscripcion
                                {
                                    Actividad = inscripcion.Actividad,
                                    IntegranteId = inscripcion.IntegranteId,
                                    ActividadId = inscripcion.ActividadId,
                                    Activa = true,
                                    FechaInscripcion = DateTime.Now.Date,
                                    FechaBaja = null
                                });
                            RefrescarInscripciones = true;
                        }
                        else
                        {
                            nuevasInscripciones.Add(new ConsultaInscripcion
                                {
                                    Actividad = inscripcion.Actividad,
                                    IntegranteId = inscripcion.IntegranteId,
                                    ActividadId = inscripcion.ActividadId,
                                    Activa = true,
                                    FechaInscripcion = inscripcion.FechaInscripcion.HasValue
                                                               ? inscripcion.FechaInscripcion.Value
                                                               : DateTime.Now.Date,
                                    FechaBaja = null
                                });
                            if (!inscripcion.FechaInscripcion.HasValue)
                            {
                                inscripcion.FechaInscripcion = DateTime.Now.Date;
                            }
                        }
                    }
                    else
                    {
                        if (inscripcion.FechaInscripcion.HasValue && !inscripcion.FechaBaja.HasValue)
                        {
                            nuevasInscripciones.Add(new ConsultaInscripcion
                            {
                                Actividad = inscripcion.Actividad,
                                IntegranteId = inscripcion.IntegranteId,
                                ActividadId = inscripcion.ActividadId,
                                Activa = false,
                                FechaInscripcion = inscripcion.FechaInscripcion,
                                FechaBaja = DateTime.Now.Date
                            });
                            inscripcion.FechaBaja = DateTime.Now.Date;
                        }
                    }
                }
                datosIntegrante.InscripcionTalleres = nuevasInscripciones;
            }
            return datosIntegrante;
        }

        private void integranteValidator_CustomValidation(object sender, ValidationEventArgs e)
        {
            if (e.Control == cmbTipoDocumento)
            {
                e.Valid = cmbTipoDocumento.SelectedIndex > 0;
            }
            if (e.Control == cbAño)
            {
                e.Valid = cbAño.SelectedIndex >= 0;
            }
            if (e.Control == cbMes)
            {
                e.Valid = cbMes.SelectedIndex >= 0;
            }
            if (e.Control == cbDia)
            {
                e.Valid = cbDia.SelectedIndex >= 0;
            }
            if (e.Control == txtNroAfiliado)
            {
                e.Valid = cmbObraSocial.SelectedIndex == 0 || (cmbObraSocial.SelectedIndex > 0 && ((ObraSocial)cmbObraSocial.SelectedItem).ObraSocialId != 1);
            }
        }

        private void LimpiarFormularioIntegrante()
        {
            LimpiarControl(tcIntegrante);
            var date = DateTime.Now;
            cbDia.SelectedIndex = date.Day - 1;
            cbMes.SelectedIndex = date.Month - 1;
            cbAño.SelectedIndex = cbAño.FindStringExact(date.Year.ToString(), 0);
            _bsGrupoFamiliar.Clear();
            _bsGrupoConvivencia.Clear();
            _bsCasoEmergencia.Clear();
            _inscripciones.ToList().ForEach(i => i.Activa = false);
            _bsInscripcionTalleres.ResetBindings(false);
        }

        private List<AsisteComedorViandaDias> ObtenerAsisteActividadDias()
        {
            var actividadDias = new List<AsisteComedorViandaDias>();
            if (!ckbComedor.Checked && !ckbVianda.Checked) return actividadDias;

            var actividadId = (int)TipoActividad.Comedor;
            if (ckbVianda.Checked) actividadId = (int)TipoActividad.Vianda;
            var integranteId = 0;
            if (Integrante != null) integranteId = Integrante.IntegranteId;

            if (ckbLunes.Checked)
            {
                actividadDias.Add(new AsisteComedorViandaDias { IntegranteId = integranteId, ActividadId = actividadId, DiaSemanaId = (int)DiaSemana.Lunes });
            }
            if (ckbMartes.Checked)
            {
                actividadDias.Add(new AsisteComedorViandaDias { IntegranteId = integranteId, ActividadId = actividadId, DiaSemanaId = (int)DiaSemana.Martes });
            }
            if (ckbMiercoles.Checked)
            {
                actividadDias.Add(new AsisteComedorViandaDias { IntegranteId = integranteId, ActividadId = actividadId, DiaSemanaId = (int)DiaSemana.Miercoles });
            }
            if (ckbJueves.Checked)
            {
                actividadDias.Add(new AsisteComedorViandaDias { IntegranteId = integranteId, ActividadId = actividadId, DiaSemanaId = (int)DiaSemana.Jueves });
            }
            if (ckbViernes.Checked)
            {
                actividadDias.Add(new AsisteComedorViandaDias { IntegranteId = integranteId, ActividadId = actividadId, DiaSemanaId = (int)DiaSemana.Viernes });
            }
            return actividadDias;
        }

        private void rbBeneficioPrev_CheckedChanged(object sender, EventArgs e)
        {
            txtMonto.Enabled = !rbNingunBeneficio.Checked;
            txtMonto.Clear();
        }

        private void btnGuardarIntegrante_Click(object sender, EventArgs e)
        {
            if (cmbObraSocial.SelectedIndex == 0)
            {
                txtNroAfiliado.Clear();
            }
            GuardarRegistro();
        }

        private void dgvGrupoFamiliar_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            e.Control.KeyPress -= textBox_KeyPress;
            if (dgvGrupoFamiliar.CurrentCell.ColumnIndex == 2)
            {
                var tb = e.Control as TextBox;
                if (tb != null)
                {
                    tb.KeyPress += textBox_KeyPress;
                }
            }
        }

        private void dgvGrupoFamiliar_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            BeginEdit(sender, e);
        }

        private void CellValidatingA(object sender, DataGridViewCellValidatingEventArgs e)
        {
            var dgv = (DataGridView)sender;
            var value = (string)e.FormattedValue;
            var error = false;
            var mensaje = "";

            switch (e.ColumnIndex)
            {
                //-Nombre
                case 0:
                    error = string.IsNullOrEmpty(value.Trim());
                    mensaje = Resources.Grilla_Completar_Nombre;
                    break;

                case 1:
                    error = string.IsNullOrEmpty(value.Trim());
                    mensaje = Resources.Grilla_Completar_Apellido;
                    break;

                case 4:
                    error = string.IsNullOrEmpty(value.Trim());
                    mensaje = Resources.Grilla_Seleccionar_Vinculo;
                    break;

                default:
                    e.Cancel = false;
                    break;
            }
            if (error)
            {
                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = mensaje;
                dgv.Rows[e.RowIndex].ErrorText = Resources.Grilla_Completar_CamposRequeridos;
            }
        }

        private void CellValidatingB(object sender, DataGridViewCellValidatingEventArgs e)
        {
            var dgv = (DataGridView)sender;
            var value = (string)e.FormattedValue;
            var error = false;
            var mensaje = "";

            switch (e.ColumnIndex)
            {
                //-Nombre
                case 0:
                    error = string.IsNullOrEmpty(value.Trim());
                    mensaje = Resources.Grilla_Completar_Nombre;
                    break;

                case 1:
                    error = string.IsNullOrEmpty(value.Trim());
                    mensaje = Resources.Grilla_Completar_Apellido;
                    break;

                case 3:
                    error = string.IsNullOrEmpty(value.Trim());
                    mensaje = Resources.Grilla_Seleccionar_Vinculo;
                    break;

                default:
                    e.Cancel = false;
                    break;
            }
            if (error)
            {
                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = mensaje;
                dgv.Rows[e.RowIndex].ErrorText = Resources.Grilla_Completar_CamposRequeridos;
            }
        }

        private void dgvGrupoFamiliar_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            CellValidatingA(sender, e);
        }

        private void RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            var dgv = (DataGridView)sender;
            var filaInvalida = dgv.Rows[e.RowIndex].Cells.Cast<DataGridViewCell>().Any(c => !string.IsNullOrEmpty(c.ErrorText));
            dgv.Rows[e.RowIndex].ErrorText = filaInvalida ? Resources.Grilla_Completar_CamposRequeridos : "";
        }

        private void dgvGrupoFamiliar_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            RowValidating(sender, e);
        }

        private void dgvGrupoFamiliar_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 2) //- Edad
            {
                var value = (int?)e.Value;
                if (value == 0)
                {
                    e.Value = e.CellStyle.NullValue;
                    e.FormattingApplied = true;
                }
            }
        }

        private void BeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            var dgv = (DataGridView)sender;
            dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "";
        }

        private void dgvPersonasEmergencia_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            BeginEdit(sender, e);
        }

        private void dgvPersonasEmergencia_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            CellValidatingB(sender, e);
        }

        private void dgvPersonasEmergencia_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            RowValidating(sender, e);
        }

        private void dgvGrupoConvivencia_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            BeginEdit(sender, e);
        }

        private void dgvGrupoConvivencia_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            CellValidatingB(sender, e);
        }

        private void dgvGrupoConvivencia_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            RowValidating(sender, e);
        }

        private void dgvGrupoFamiliar_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            e.Cancel = true;
            e.ThrowException = false;
        }

        private void dgvPersonasEmergencia_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            e.Cancel = true;
            e.ThrowException = false;
        }

        private void dgvGrupoConvivencia_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            e.Cancel = true;
            e.ThrowException = false;
        }

        #endregion [Metodos Privados]

        private void ckbComedor_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbComedor.Checked)
            {
                ckbVianda.Checked = false;
            }
            pnlDias.Enabled = ckbComedor.Checked || ckbVianda.Checked;
        }

        private void ckbVianda_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbVianda.Checked)
            {
                ckbComedor.Checked = false;
            }
            pnlDias.Enabled = ckbComedor.Checked || ckbVianda.Checked;
        }

        private void btnBorrarPE_Click(object sender, EventArgs e)
        {
            if (dgvPersonasEmergencia.CurrentRow == null) return;

            dgvPersonasEmergencia.Rows.RemoveAt(dgvPersonasEmergencia.CurrentRow.Index);
        }

        private void cmbObraSocial_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbObraSocial.SelectedIndex > 0)
            {
                //-Nro de afiliado requerido si la obra social es PAMI
                if (((ObraSocial) cmbObraSocial.SelectedItem).ObraSocialId == 1)
                {
                    integranteValidator.SetType(this.txtNroAfiliado, ValidationType.Required);
                    integranteValidator.SetRequiredMessage(this.txtNroAfiliado, "Indique un nro. de afiliado");
                }
                else
                {
                    integranteValidator.SetType(this.txtNroAfiliado, ValidationType.None);
                    integranteValidator.SetRequiredMessage(this.txtNroAfiliado, string.Empty);
                }
            }
            else
            {
                    integranteValidator.SetType(this.txtNroAfiliado, ValidationType.None);
                    integranteValidator.SetRequiredMessage(this.txtNroAfiliado, string.Empty);
                
            }
        }

    }

    public struct NivelEstudioIntegrante
    {
        public bool NivelEstudioCompleto;
        public int NivelEstudioId;
    }

    public class DatosIntegrante
    {
        public List<AsisteComedorViandaDias> AsisteDias { get; set; }

        public List<PersonaReferencia> GrupoConvivencia { get; set; }

        public List<PersonaReferencia> GrupoFamiliar { get; set; }

        public List<ConsultaInscripcion> InscripcionTalleres { get; set; }

        public Integrante Integrante { get; set; }

        public List<PersonaReferencia> PersonasCasoEmergencia { get; set; }
    }
}